//
// Created by 11510 on 2024/6/23.
//

#ifndef TEXTQUERY_QUERYBASE_H
#define TEXTQUERY_QUERYBASE_H
#include "QueryResult.h"
#include "TextQuery.h"

/**
 * 抽象基类
 * 具体查询从基类中派生，所有成员都是private
 */
class QueryBase {
    friend class Query;

protected:
    using line_no = TextQuery::line_no; /* 用于eval */
    virtual ~QueryBase() = default;

private:
    /**
     * eval:evaluates v.评估
     * 精髓：传入一个构建好了每个单词和行号的映射的集合类
     * 返回一个结果集，也就是说只加载了一次文件，但是文件是所有单词都有映射
     * @return 返回与当前Query匹配的QueryResult
     */
    virtual QueryResult eval(const TextQuery &) const = 0;

    /**
     * rep is a string representation of the query
     * @return
     */
    virtual string rep() const = 0;
};

#endif //TEXTQUERY_QUERYBASE_H
